﻿using SharpGL;
using SharpGL.SceneGraph;

using System;
using System.Windows.Forms;

namespace UCTT.GL
{
    /// <summary>
    /// 原文链接：使用SharpGL三维建模技术生成3D井眼轨迹图-腾讯云开发者社区-腾讯云
    /// https://cloud.tencent.com/developer/article/1533484
    /// </summary>
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }

        // OpenGL初始化事件
        private void openGLControl1_OpenGLInitialized(object sender, EventArgs e)
        {

        }

        // OpenGL渲染事件
        private void openGLControl1_OpenGLDraw(object sender, SharpGL.RenderEventArgs args)
        {
            OpenGL gl = this.openGLControl1.OpenGL;

            // 后背景面：
            //Texture texture = new Texture();
            //texture.Create(gl, "20190919154917.png");

            # region       绘制后背景面：
            gl.Begin(OpenGL.GL_QUADS);
            gl.TexCoord(1.0f, 0.0f);
            gl.Vertex(-2.0f, 0.0f, -2.0f);    // 右下
            gl.TexCoord(1.0f, 1.0f);
            gl.Vertex(-2.0f, 4.0f, -2.0f);    // 右上
            gl.TexCoord(0.0f, 1.0f);
            gl.Vertex(2.0f, 4.0f, -2.0f);// 左上
            gl.TexCoord(0.0f, 0.0f);
            gl.Vertex(2.0f, 0.0f, -2.0f);// 左下
            # endregion

            # region       绘制右侧背景面：
            gl.Color(0.8f, 0.8f, 0.8f); // 设置灰色背景色
            gl.Vertex(-2.0f, 0.0f, -2.0f); // 接着绘制四个顶点
            gl.Vertex(-2.0f, 0.0f, 2.0f);
            gl.Vertex(-2.0f, 4.0f, 2.0f);
            gl.Vertex(-2.0f, 4.0f, -2.0f);
            gl.End();
            # endregion

            # region       设置OpenGL.GL_LINES类型，绘制网格线。
            //在X,Z平面上绘制网格
            for (float i = -2; i <= 2; i += 0.5f)
            {
                gl.Begin(OpenGL.GL_LINES); // 设置类型为绘制线

                //X轴方向
                gl.Vertex(-2f, 0f, i);
                gl.Vertex(2f, 0f, i);

                //Z轴方向
                gl.Vertex(i, 0f, -2f);
                gl.Vertex(i, 0f, 2f);

                gl.End();
            }
            # endregion

            # region       绘制东西轴线 / 南北轴线 / 深度轴线
            gl.Begin(OpenGL.GL_LINE_STRIP); // 来绘制坐标轴线
            gl.LineWidth(2f); // 设置线宽，使用比网格粗一点的线。

            //Y轴方向
            gl.Vertex(0.0f, 0.0f, 0.0f);
            gl.Vertex(0.0f, 4.0f, 0.0f);

            //X轴方向
            gl.Vertex(-2.0f, 4.0f, 0.0f);
            gl.Vertex(0.0f, 4.0f, 0.0f);

            //Z轴方向
            gl.Vertex(0.0f, 0.0f, -2.0f);
            gl.Vertex(0.0f, 0.0f, 2.0f);
            #endregion

            #region       绘制井口横纵投影线
            // 井口横纵投影线有点特殊，用的是虚线。
            gl.Color(0.8f, 0.8f, 0.8f); // 设置颜色
            gl.LineWidth(1f); // 线宽
            gl.Enable(OpenGL.GL_LINE_STIPPLE); // 允许绘制虚线
            gl.LineStipple(1, 0x3F07); // 设置虚线的种类，具体类型可搜索OpenGL文档

            gl.Vertex(-2.0f, 4.0f, 0.0f);
            gl.Vertex(0.0f, 4.0f, 0.0f);
            #endregion

            #region       绘制底部东西/南北刻度线/深度刻度线
            for (float i = 0; i <= 4; i = i + 0.5f)
            {
                gl.Begin(OpenGL.GL_LINE_STRIP);
                gl.Vertex(-0.04f, i, 0f);
                gl.Vertex(0.04f, i, 0f);
                gl.End();

                //获取三维点的二维坐标
                var sv = OpenGLSceneGraphExtensions.Project(gl, new Vertex(0.05f, i, 0.0f));
                gl.DrawText((int)(sv.X), (int)(sv.Y), 1, 1, 1, "宋体", 10, (i * 1000).ToString());
            }
            #endregion

            #region       绘制井眼轨迹线/投影线
            gl.Color(1.0f, 1.0f, 0f); // 设置颜色
            gl.LineWidth(1f);

            //绘制连续的曲线
            gl.Begin(OpenGL.GL_LINE_STRIP);

            //获取井眼轨迹的三维坐标值
            //var vertexList = LoadWellVertexList();
            //foreach (var vertex in vertexList)
            //{
            //    gl.Vertex(vertex); // 绘制测点
            //}
            #endregion

            #region       绘制井底点水平线
            // 查找到最底部的测点，然后绘制一条到Y轴的直线即可。
            #endregion

            #region       缩放/旋转
            //gl.Scale(ScaleValue, ScaleValue, ScaleValue);
            //gl.Rotate(rtri, 0.0f, 1.0f, 0.0f);
            #endregion

            gl.Flush();
        }

        // 控件大小事件
        private void openGLControl1_Resize(object sender, EventArgs e)
        {

        }
    }
}
